package controllers

import (
	"encoding/json"
	"ginstudydemo.com/main/models"
	"ginstudydemo.com/main/service"
	"github.com/gin-gonic/gin"
)

type IDictController interface {
}

type DictController struct{}

func NewDictController() *DictController {
	return &DictController{}
}

// GetDictPage 获取字典分页列表
func (m DictController) GetDictPage(c *gin.Context) {
	var query models.DictPageQuery
	var pagination models.PaginationParams
	// 获取查询参数（除分页参数）
	if err := c.ShouldBindQuery(&query); err != nil {
		service.ReturnErr(c, "9999", "ShouldBindQuery:"+err.Error())
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}

	// 获取分页参数
	if err := c.ShouldBindQuery(&pagination); err != nil {
		service.ReturnErr(c, "9999", "ShouldBindQuery:pagination:"+err.Error())
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}

	data, count, pageNum, pageSize, modelErr := models.GetDictPageList(query, pagination)

	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "查询错误#"+modelErr.Error())
		c.Abort()
		return
	}

	dictDatas, _ := models.ParseDictItems(data)

	service.ReturnSuccess[models.DictPageDataRes](c, "2000", "ok", models.DictPageDataRes{
		Total:    count,
		PageSize: pageSize,
		PageNum:  pageNum,
		List:     dictDatas,
	})
}

// GetDictForm 获取字典表单
func (m DictController) GetDictForm(c *gin.Context) {

	id := c.Param("id")

	res, modelErr := models.GetDictInfoById(id)
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "查询错误#"+modelErr.Error())
		c.Abort()
		return
	}
	var dictItems []models.DictItem
	json.Unmarshal([]byte(res.DictItems.String), &dictItems)
	dpiRes := models.DictPageItemRes{
		Code:      res.Code,
		ID:        res.ID,
		Name:      res.Name,
		Status:    res.Status,
		DictItems: dictItems,
	}

	service.ReturnSuccess[models.DictPageItemRes](c, "2000", "ok", dpiRes)

}

// AddDict  新增字典
func (m DictController) AddDict(c *gin.Context) {

	//使用数据表结构体获取参数
	param := &models.DictPageItemRes{}
	// 把结构体指针传入BindJSON，这样param的值才能同步修改
	cErr := c.BindJSON(param)
	if !(cErr == nil) {
		service.ReturnErr(c, "5000", cErr)
		c.Abort()
		return
	}

	addId, modelErr := models.AddDict(*param)
	if !(modelErr == nil) {
		service.ReturnErr(c, "5000", modelErr)
		c.Abort()
		return
	}

	service.ReturnSuccess[int64](c, "2000", "ok", addId)

}

// EditDict  修改字典
func (m DictController) EditDict(c *gin.Context) {

	ParamId := c.Param("id")

	//使用数据表结构体获取参数
	param := &models.DictPageItemRes{}
	// 把结构体指针传入BindJSON，这样param的值才能同步修改
	cErr := c.BindJSON(param)
	if !(cErr == nil) {
		service.ReturnErr(c, "5000", cErr)
		c.Abort()
		return
	}

	id, modelErr := models.EditDict(*param, ParamId)
	if !(modelErr == nil) {
		service.ReturnErr(c, "5000", modelErr)
		c.Abort()
		return
	}

	service.ReturnSuccess[string](c, "2000", "ok", id)

}

// DelDict 删除字典
func (m DictController) DelDict(c *gin.Context) {
	ids := c.Param("ids")

	if ids == "" {
		service.ReturnErr(c, "9999", "error:ids为空")
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}

	modelErr := models.DelDict(ids)
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "error:系统错误#"+modelErr.Error())
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}
	service.ReturnSuccess(c, "2000", "ok", struct{}{})
}
